/*
 jChecs: a Java chess game sample 

 Copyright (C) 2006-2011 by David Cotton

 This program is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation; either version 2 of the License, or (at your option) any later
 version.

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
 Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
package fr.free.jchecs.core;

/**
 * Interface mise à disposition par les classes permettant de générer des
 * mouvements.
 * 
 * @author David Cotton
 */
public interface MoveGenerator extends Board {
	/**
	 * Renvoi une nouvelle instance, initialisée à partir d'un état quelconque.
	 * 
	 * @param pEtat
	 *            Etat de départ.
	 * @return Copie de l'état.
	 */
	MoveGenerator derive(final Board pEtat);

	/**
	 * Renvoi une nouvelle instance décrivant l'état du jeu après application
	 * d'un mouvement.
	 * 
	 * @param pMouvement
	 *            Description de mouvement.
	 * @param pSuivant
	 *            Drapeau positionné si l'on souhaite que le trait soit modifié.
	 * @return Instance dérivée.
	 */
	MoveGenerator derive(final Move pMouvement, final boolean pSuivant);

	/**
	 * Renvoi toutes les cases cibles des mouvements possibles (y compris ceux
	 * mettant le roi en échec) pour la pièce contenue par une case.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getAllTargets(final Square pOrigine);

	/**
	 * Renvoi toutes les cases cibles possibles d'un mouvement de type "fou"
	 * d'une certaine couleur (y compris ceux mettant le roi en échec) à partir
	 * d'une case.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @param pBlanc
	 *            Positionné à vrai si la recherche concerne les blancs.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getBishopTargets(final Square pOrigine, final boolean pBlanc);

	/**
	 * Renvoi la case contenant le roi d'une couleur.
	 * 
	 * @param pCouleur
	 *            Mis à "true" si l'on recherche le roi blanc, à "false" sinon.
	 * @return Case contenant le roi.
	 */
	Square getKingSquare(final boolean pCouleur);

	/**
	 * Renvoi la liste des cases pouvant être atteintes par un mouvement de type
	 * roi.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @param pBlanc
	 *            A vrai pour indiquer une recherche sur les blancs.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getKingTargets(final Square pOrigine, final boolean pBlanc);

	/**
	 * Renvoi la liste des cases pouvant être atteintes par un mouvement de type
	 * cavalier.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @param pBlanc
	 *            A vrai pour indiquer une recherche sur les blancs.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getKnightTargets(final Square pOrigine, final boolean pBlanc);

	/**
	 * Renvoi la liste des cases pouvant être atteintes par un mouvement de type
	 * pion.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @param pBlanc
	 *            A vrai pour indiquer une recherche sur les blancs.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getPawnTargets(final Square pOrigine, final boolean pBlanc);

	/**
	 * Renvoi toutes les cases cibles possibles d'un mouvement de type "dame"
	 * d'une certaine couleur (y compris ceux mettant le roi en échec) à partir
	 * d'une case.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @param pBlanc
	 *            Mis à vrai pour rechercher pour les blancs.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getQueenTargets(final Square pOrigine, final boolean pBlanc);

	/**
	 * Renvoi toutes les cases cibles possibles d'un mouvement de type "tour"
	 * d'une certaine couleur (y compris ceux mettant le roi en échec) à partir
	 * d'une case.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @param pBlanc
	 *            Mis à vrai pour rechercher pour les blancs.
	 * @return Liste des cases cibles (y compris celles conduisant à un échec).
	 */
	Square[] getRookTargets(final Square pOrigine, final boolean pBlanc);

	/**
	 * Renvoi tous les mouvements valides pour une couleur.
	 * 
	 * @param pTrait
	 *            Positionné à "true" pour indiquer une recherche pour les
	 *            blancs.
	 * @return Liste des mouvements valides.
	 */
	Move[] getValidMoves(final boolean pTrait);

	/**
	 * Renvoi toutes les cases cibles des mouvements valides à partir d'une
	 * case.
	 * 
	 * @param pOrigine
	 *            Case à l'origine du mouvement.
	 * @return Liste des cases cibles.
	 */
	Square[] getValidTargets(final Square pOrigine);

	/**
	 * Indique si une case est attaquée par une couleur.
	 * 
	 * @param pCible
	 *            Case cible.
	 * @param pCouleur
	 *            Positionné à "true" pour tester l'attaque par les blancs.
	 * @return Vrai si la case est attaquée.
	 */
	boolean isAttacked(final Square pCible, final boolean pCouleur);

	/**
	 * Indique si le roi d'une couleur a roqué.
	 * 
	 * @param pBlanc
	 *            Positionné à "true" pour obtenir l'état des blancs.
	 * @return A "vrai" si le roi correspondant à roqué.
	 */
	boolean isCastled(final boolean pBlanc);

	/**
	 * Indique si le roi d'une couleur est en échec.
	 * 
	 * @param pCouleur
	 *            Positionné à "true" pour tester l'échec sur les blancs, à
	 *            "false" sinon.
	 * @return Vrai si le roi est en échec.
	 */
	boolean isInCheck(final boolean pCouleur);
}
